import axios from 'axios'
import config from '../config/index' // 路径配置
import router from '../router';
// 导入Nprogress包对应的js和css
import NProgress from 'nprogress'
import 'nprogress/nprogress.css' // progress bar style

// 创建axios 实例
const service = axios.create({
    baseURL: config.baseURL, // api的base_url
    timeout: 10000, // 请求超时时间
    headers: {
        'Content-Type': 'application/json; charset=utf-8'
    }
});
// request 拦截器
service.interceptors.request.use(
    config => {
    // 在request拦截器中，展示进度条NProgress.start（）
        NProgress.start();
        // 这里可以自定义一些config 配置
        // 防止IE浏览器缓存
        config.headers['Cache-Control'] = 'no-cache';
        // 为请求头对象，添加Token验证的Authorization字段
        if (sessionStorage.getItem('token')) {
            config.headers.Authorization = sessionStorage.getItem('token');
        }
        return config
    },
    error => {
    //  这里处理一些请求出错的情况
        Promise.reject(error)
    }
);

// response 拦截器
service.interceptors.response.use(
    config => {
    // 在response拦截器中，隐藏进度条NProgress.done（）
        NProgress.done();
        // 如果返回的状态码为200，说明接口请求成功，可以正常拿到数据
        // 否则的话抛出错误
        if (config.status === 200) {
            return Promise.resolve(config.data);
        } else {
            return Promise.reject(config);
        }
    },
    // 服务器状态码不是2开头的的情况
    // 这里可以跟你们的后台开发人员协商好统一的错误状态码
    // 然后根据返回的状态码进行一些操作，例如登录过期提示，错误提示等等
    // 下面列举几个常见的操作，其他需求可自行扩展
    error => {

        // 这里处理一些response 出错时的逻辑
        if (error.response.status) {
            switch (error.response.status) {
            // 401: 未登录
            // 未登录则跳转登录页面，并携带当前页面的路径
            // 在登录成功后返回当前页面，这一步需要在登录页操作。
            case 401:
                router.replace({
                    path: '/login',
                    query: {
                        redirect: router.currentRoute.fullPath
                    }
                });
                break;
            }
        }
    }
);
// 实例变量支持all
service.all = axios.all;
export default service